/**
 * 死锁，最大的问题就是由两个以上的互斥量来锁定一个操作
 * 
 * 避免死锁的建议，可以让两个互斥量总是以相同的顺序上锁，依然会产生死锁，
 * 
 * std::lock  一次锁住多个互斥量
 */

#include <mutex>

class some_big_object
{};

void swap(some_big_object& lhs,some_big_object& rhs)
{}

class X
{
private:
    some_big_object some_detail;
    mutable std::mutex m;
public:
    X(some_big_object const& sd):some_detail(sd){}

    friend void swap(X& lhs, X& rhs)
    {
        if(&lhs==&rhs)  //判断是否是同一个对象
            return;
        std::lock(lhs.m,rhs.m);  //锁住两个对象中的 互斥量；要么锁住两个要么都锁不住
        std::lock_guard<std::mutex> lock_a(lhs.m,std::adopt_lock);
        std::lock_guard<std::mutex> lock_b(rhs.m,std::adopt_lock);
        swap(lhs.some_detail,rhs.some_detail);
    }
};

int main()
{}
